package com.googlecode.horncomb.organ.srvc;

import java.util.Collection;
import java.util.List;

import com.googlecode.horncomb.organ.Group;
import com.googlecode.horncomb.organ.Person;

/**
 * 人员管理服务
 * @author Daniel
 */
public interface PersonService {

	/**
	 * 找到人员所在的默认组织
	 * @param personId
	 *            人员Id
	 * @param groupNature
	 *            组织类型
	 * @param membershipNature
	 *            关系类型
	 * @return 人员默认组织
	 */
	public Group getDefaultGroup(String personId, String groupNature,
			String membershipNature);

	public Person getById(String groupId);

	/**
	 * 创建人员信息
	 * @param person
	 *            新人员对象
	 */
	public void create(Person person);

	/**
	 * 更新人员信息
	 * @param person
	 *            人员对象
	 */
	public void update(Person person);

	/**
	 * 删除人员信息
	 * @param personId
	 *            人员Id
	 * @param delted
	 *            是否真实删除.
	 */
	public void removeById(String personId, boolean deleted);

	// -----------------------------------------------------------
	// countGroups

	/**
	 * 统计人员关联的组织个数.
	 * @param personId
	 *            人员Id.
	 * @param groupNatures
	 *            组织类型.
	 * @param membershipNatures
	 *            成员类型.
	 * @return 组织个数.
	 */
	public int countGroups(String personId, String[] groupNatures,
			String[] membershipNatures);

	/**
	 * 统计人员关联的组织个数.
	 * @param personIds
	 *            人员Id.
	 * @param groupNatures
	 *            组织类型.
	 * @param membershipNatures
	 *            成员类型.
	 * @return 组织个数.
	 */
	public int countGroups(Collection<String> personIds, String[] groupNatures,
			String[] membershipNatures);

	// -----------------------------------------------------------
	// findGroups

	/**
	 * 获取人员关联的组织.
	 * @param personId
	 *            人员Id.
	 * @param view
	 *            视图类型.
	 * @param groupNatures
	 *            组织类型.
	 * @param membershipNatures
	 *            成员类型.
	 * @return 组织列表.
	 */
	public List<? extends Group> findGroups(String personId, String view,
			String[] groupNatures, String[] membershipNatures);

	/**
	 * 获取人员关联的组织.
	 * @param personIds
	 *            人员Id.
	 * @param view
	 *            视图类型.
	 * @param groupNatures
	 *            组织类型.
	 * @param membershipNatures
	 *            成员类型.
	 * @return 组织列表.
	 */
	public List<? extends Group> findGroups(Collection<String> personIds,
			String view, String[] groupNatures, String[] membershipNatures);

}
